"""
后台任务配置

包含 Celery 和任务相关的所有配置项
"""

import os
from datetime import timedelta

# ========== Redis 配置 ==========

# Redis 连接配置（用于 Celery broker 和 result backend）
REDIS_HOST = os.getenv("REDIS_HOST", "localhost")
REDIS_PORT = int(os.getenv("REDIS_PORT", 6379))
REDIS_DB = int(os.getenv("REDIS_DB", 0))
REDIS_PASSWORD = os.getenv("REDIS_PASSWORD", None)

# 构建 Redis URL
if REDIS_PASSWORD:
    REDIS_URL = f"redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB}"
else:
    REDIS_URL = f"redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB}"


# ========== Celery 配置 ==========

class CeleryConfig:
    """Celery 配置类"""
    
    # Broker 设置（消息队列）
    broker_url = REDIS_URL
    broker_connection_retry_on_startup = True
    
    # Result Backend 设置（结果存储）
    result_backend = REDIS_URL
    result_expires = 3600  # 结果过期时间（秒）
    
    # 任务序列化
    task_serializer = "json"
    result_serializer = "json"
    accept_content = ["json"]
    
    # 时区设置
    timezone = "Asia/Shanghai"
    enable_utc = True
    
    # 任务执行设置
    task_track_started = True  # 跟踪任务开始状态
    task_time_limit = 30 * 60  # 任务最大执行时间（30分钟）
    task_soft_time_limit = 25 * 60  # 软超时限制（25分钟）
    
    # Worker 设置
    worker_prefetch_multiplier = 4  # 每个 worker 预取的任务数
    worker_max_tasks_per_child = 1000  # 每个 worker 子进程最多执行的任务数
    
    # 日志设置
    worker_log_format = "[%(asctime)s: %(levelname)s/%(processName)s] %(message)s"
    worker_task_log_format = "[%(asctime)s: %(levelname)s/%(processName)s][%(task_name)s(%(task_id)s)] %(message)s"
    
    # Beat 设置（定时任务调度器）
    beat_schedule = {
        # 示例：每30秒执行一次
        'test-every-30-seconds': {
            'task': 'tasks.test_periodic_task',
            'schedule': 30.0,
        },
        # 示例：每天凌晨1点执行
        'cleanup-daily': {
            'task': 'tasks.cleanup_old_files',
            'schedule': timedelta(days=1),
            'options': {'expires': 3600}  # 任务过期时间
        },
        # 示例：每小时执行
        'generate-report-hourly': {
            'task': 'tasks.generate_hourly_report',
            'schedule': timedelta(hours=1),
        },
    }


# ========== 任务优先级 ==========

class TaskPriority:
    """任务优先级"""
    CRITICAL = 9  # 关键任务
    HIGH = 7      # 高优先级
    NORMAL = 5    # 普通优先级
    LOW = 3       # 低优先级
    BULK = 1      # 批量任务


# ========== 任务队列 ==========

class TaskQueues:
    """任务队列定义"""
    DEFAULT = "default"       # 默认队列
    HIGH_PRIORITY = "high"    # 高优先级队列
    LOW_PRIORITY = "low"      # 低优先级队列
    EMAIL = "email"           # 邮件队列
    REPORT = "report"         # 报表队列
    FILE_PROCESSING = "files" # 文件处理队列


# ========== 邮件配置（示例）==========

EMAIL_CONFIG = {
    "smtp_host": os.getenv("SMTP_HOST", "smtp.gmail.com"),
    "smtp_port": int(os.getenv("SMTP_PORT", 587)),
    "smtp_user": os.getenv("SMTP_USER", "your-email@gmail.com"),
    "smtp_password": os.getenv("SMTP_PASSWORD", "your-password"),
    "from_email": os.getenv("FROM_EMAIL", "noreply@example.com"),
}


# ========== 文件处理配置 ==========

FILE_PROCESSING_CONFIG = {
    "max_image_size": 10 * 1024 * 1024,  # 10 MB
    "thumbnail_sizes": {
        "small": (150, 150),
        "medium": (300, 300),
        "large": (600, 600),
    },
    "video_quality": "720p",
    "audio_bitrate": "192k",
}


# ========== 任务重试配置 ==========

class RetryConfig:
    """任务重试配置"""
    max_retries = 3           # 最大重试次数
    retry_backoff = True      # 使用指数退避
    retry_backoff_max = 600   # 最大退避时间（秒）
    retry_jitter = True       # 添加随机抖动
    default_retry_delay = 60  # 默认重试延迟（秒）


# ========== 监控配置 ==========

MONITORING_CONFIG = {
    "enable_events": True,          # 启用事件
    "send_task_sent_event": True,   # 发送任务发送事件
    "send_task_received_event": True,  # 发送任务接收事件
}

